08 sample_vpad-jujikey-noimg.hsp

sample\ 08 sample_vpad-jujikey-noimg.hsp

#include "hsp3dish.as"

#include "mod_layerbutton.hsp"

#packopt xsize 480
#packopt ysize 800

	screen 0,480,800
	
	pxConL = 80  ; コントローラ表示位置の中心X座標
	pyConL = ginfo_sy-90  ; コントローラ表示位置の中心Y座標
	szConL = 1.0  ; コントローラのサイズ倍率
	opConL = 0  ; タッチエリア範囲確認フラグ
	gosub *create_jujiCon

	pxConR = ginfo_sx-60
	pyConR = ginfo_sy-70
	szConR = 1.0
	gosub *create_btnCon

repeat
	redraw 0 : color 255,255,255 : boxf : color : pos 10,0 : font msgothic,17
	mes "左を押したフレーム数: "+hidari
	mes "上を押したフレーム数: "+ue
	mes "右を押したフレーム数: "+migi
	mes "下を押したフレーム数: "+shita
	mes "Aを押したフレーム数: "+aaa
	mes "Bを押したフレーム数: "+bbb
	mes "メニューを押した回数: "+mmm
	redraw 1
	await 1000/60
loop

// 十字キー作成
*create_jujiCon
	; 左
	pos pxConL-(szConL*68), pyConL-(szConL*32)
	layerbutton szConL*64,szConL*64, 0,0 {
		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
		laybtn_hitarea 5, 0,0, szConL*32,szConL*-32, szConL*56,szConL*32, szConL*32,szConL*96, 0,szConL*64  ; ヒットエリア調整 : 斜め入力できるように
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
			swend
			boxfao 0,0, szConL*32,szConL*64,  objlayer_axis_x, objlayer_axis_y
			trianglefao szConL*32,0, szConL*64,szConL*32, szConL*32,szConL*64,  objlayer_axis_x, objlayer_axis_y
			if opConL {  ; タッチエリア表示
				arr = 0,0, int(szConL*32),int(szConL*-32), int(szConL*56),int(szConL*32), int(szConL*32),int(szConL*96), 0,int(szConL*64), 0,0
				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
			}
			if layerbtn_stat == LAYBTN_PRESS_IN {
				hidari++
			}
		}
		return
	}
	; 上
	pos pxConL-(szConL*32), pyConL-(szConL*68)
	layerbutton szConL*64,szConL*64, 1,0 {
		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
		laybtn_hitarea 5, 0,0, szConL*64,0, szConL*96,szConL*32, szConL*32,szConL*56, szConL*-32,szConL*32  ; ヒットエリア調整 : 斜め入力できるように
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
			swend
			boxfao 0,0, szConL*64,szConL*32,  objlayer_axis_x, objlayer_axis_y
			trianglefao szConL*64,szConL*32, szConL*32,szConL*64, 0,szConL*32,  objlayer_axis_x, objlayer_axis_y
			if opConL {  ; タッチエリア表示
				arr = 0,0, int(szConL*64),0, int(szConL*96),int(szConL*32), int(szConL*32),int(szConL*56), int(szConL*-32),int(szConL*32), 0,0
				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
			}
			if layerbtn_stat == LAYBTN_PRESS_IN {
				ue++
			}
		}
		return
	}
	; 右
	pos pxConL+(szConL*4), pyConL-(szConL*32)
	layerbutton szConL*64,szConL*64, 2,0 {
		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
		laybtn_hitarea 5, szConL*8,szConL*32, szConL*32,szConL*-32, szConL*64,0, szConL*64,szConL*64, szConL*32,szConL*96  ; ヒットエリア調整 : 斜め入力できるように
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
			swend
			boxfao szConL*32,0, szConL*64,szConL*64,  objlayer_axis_x, objlayer_axis_y
			trianglefao szConL*32,szConL*64, 0,szConL*32, szConL*32,0,  objlayer_axis_x, objlayer_axis_y
			if opConL {  ; タッチエリア表示
				arr = int(szConL*8),int(szConL*32), int(szConL*32),int(szConL*-32), int(szConL*64),0, int(szConL*64),int(szConL*64), int(szConL*32),int(szConL*96), int(szConL*8),int(szConL*32)
				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
			}
			if layerbtn_stat == LAYBTN_PRESS_IN {
				migi++
			}
		}
		return
	}
	; 下
	pos pxConL-(szConL*32), pyConL+(szConL*4)
	layerbutton szConL*64,szConL*64, 3,1 {
		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
		laybtn_hitarea 5, szConL*32,szConL*8, szConL*96,szConL*32, szConL*64,szConL*64, 0,szConL*64, szConL*-32,szConL*32  ; ヒットエリア調整 : 斜め入力できるように
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
			swend
			boxfao 0,szConL*32, szConL*64,szConL*64,  objlayer_axis_x, objlayer_axis_y
			trianglefao 0,szConL*32, szConL*32,0, szConL*64,szConL*32,  objlayer_axis_x, objlayer_axis_y
			if opConL {  ; タッチエリア表示
				arr = int(szConL*32),int(szConL*8), int(szConL*96),int(szConL*32), int(szConL*64),int(szConL*64), 0,int(szConL*64), int(szConL*-32),int(szConL*32), int(szConL*32),int(szConL*8)
				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
			}
			if layerbtn_stat == LAYBTN_PRESS_IN {
				shita++
			}
		}
		return
	}
	return

// ボタン作成
*create_btnCon
	; A
	pos pxConR-(szConR*48), pyConR-(szConR*48)
	layerbutton szConR*96,szConR*96, 0,1 {
		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
		laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x  ; 円形ヒットエリア
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : objcolor 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : objcolor 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : objcolor 250,190, 70 : swbreak
			swend
			circlefao objlayer_axis_x, objlayer_axis_y, objlayer_axis_x+objlayer_size_x, objlayer_axis_y+objlayer_size_y, 8
			font msgothic,20,1 : laybtn_mes "A",4+16, 1,1
			if layerbtn_stat == LAYBTN_PRESS_IN {
				aaa++
			}
		}
		return
	}
	; B
	pos pxConR-(szConR*124), pyConR-(szConR*16)
	layerbutton szConR*64,szConR*64, 1,1 {
		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
		laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x  ; 円形ヒットエリア
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : objcolor 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : objcolor 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : objcolor 250,190, 70 : swbreak
			swend
			circlefao objlayer_axis_x, objlayer_axis_y, objlayer_axis_x+objlayer_size_x, objlayer_axis_y+objlayer_size_y, 6
			font msgothic,20,1 : laybtn_mes "B",4+16, 1,1
			if layerbtn_stat == LAYBTN_PRESS_IN {
				bbb++
			}
		}
		return
	}
	; menu
	pos pxConR+(szConR*-13), pyConR-(szConR*95)
	layerbutton szConR*67,szConR*50, 2,1 {
		laybtn_settings 0,0,5
		laybtn_hitarea 6, szConR*2,szConR*34, szConR*10,szConR*1, szConR*42,szConR*6, szConR*65,szConR*19, szConR*55,szConR*51, szConR*33,szConR*39  ; ヒットエリア
		if lparam == objlayer_cmddraw {
			gmode 3,,,150
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
			swend
			arr = szConR*6,szConR*35, szConR*3,szConR*31, szConR*9,szConR*4, szConR*12,szConR*2, szConR*42,szConR*6, szConR*62,szConR*17, szConR*64,szConR*21, szConR*56,szConR*47, szConR*52,szConR*49, szConR*33,szConR*39, szConR*6,szConR*35
			lineArray arr,11, objlayer_axis_x,objlayer_axis_y
			font msgothic,20,1 : laybtn_mes "≡",16, 1,1, 3,-1
			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
				laybtn_enable 0, 0  ; バーチャルパッドを操作無効にする
				laybtn_enable 1, 0  ; 
				gosub *create_pausemenu  ; ポーズメニュー画面の作成
				mmm++
			}
		}
		return
	}
	return

// ポーズメニュー画面作成
*create_pausemenu
	; メニュー画面全体 (グループ:2)
	pos 0,0
	layerbutton ginfo_sx,ginfo_sy, 0,2 {
		laybtn_settings 1,1,0  ; 設定 : キー/マウス操作無効
		if lparam == objlayer_cmddraw {
			font msgothic,20,1 : color 255,255,255
			laybtn_ezbox $AA000000,$AA000000,$AA000000, "Pause Menu",0, 0,-150,,,0  ; 半透明黒で画面全体を覆う(角丸なし長方形)
		}
		return
	}
	; タッチエリア表示 (グループ:3)
	pos 100, 370
	layerbutton 320,40, 0,3 {
		laybtn_settings 0,2,1  ; 設定 : 押しても消さない
		if lparam == objlayer_cmddraw {
			color 200,200,200
			font msgothic,18,0 : laybtn_mes "十字キーのタッチエリア表示 : ",1, 0,1
			gmode 3,,,256
			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
			case LAYBTN_FOCUS_IN : 
			case LAYBTN_PRESS_IN : color 190,175,230 : swbreak  ; FOCUSもPRESSも同じ色にする
			swend
			boxfao ginfo_cx,objlayer_axis_y, ginfo_cx+objlayer_size_y,objlayer_axis_y2  ; laybtn_mesで書いた文字の隣に描画
			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
				opConL = 1 - opConL  ; タッチエリア表示オプションのON/OFF
			}
			if opConL {
				font msgothic,20,1 : color : objcolor 0,0,0
				pos ginfo_cx+10, : mes "レ",4  ; 簡易的にレ点でチェックマーク
			}
		}
		return
	}
	; 閉じる (グループ:3)
	pos 140, 470
	layerbutton 200,40, 1,3 {
		if lparam == objlayer_cmddraw {
			font msgothic,20,1 : color
			laybtn_ezbox $C8C8DC, $BEAFE6, $FABE46, "閉じる"
			if layerbtn_stat & LAYBTN_COMPLETE {
				laybtn_enable 0, 1  ; バーチャルパッドの操作を有効にする
				laybtn_enable 1, 1
				laybtn_hide 2  ; グループ2のオブジェクトを非表示処理 (閉じるボタン[グループ3]は押したら消える)
			}
		}
		return
	}
	return

// 描画モジュール
#module
#deffunc lineArray array arr, int p1, int ox, int oy
	pos ox+arr(0),oy+arr(1)
	repeat limit(p1-1,0,length(arr)/2-1),1
		line ox+arr(cnt*2),oy+arr(cnt*2+1)
	loop
	return
#deffunc boxfao int ax, int ay, int bx, int by, int ox, int oy
	pdx=ax+ox,bx+ox,bx+ox,ax+ox
	pdy=ay+oy,ay+oy,by+oy,by+oy
	gsquare -1,pdx,pdy
	return
#deffunc trianglefao int ax, int ay, int bx, int by, int cx, int cy, int ox, int oy
	pdx=ax+ox,bx+ox,cx+ox,ax+ox
	pdy=ay+oy,by+oy,cy+oy,ay+oy
	gsquare -1,pdx,pdy
	return
#deffunc quadfao int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy, int ox, int oy
	pdx=ax+ox,bx+ox,cx+ox,dx+ox
	pdy=ay+oy,by+oy,cy+oy,dy+oy
	gsquare -1,pdx,pdy
	return
#deffunc circlefao int x1, int y1, int x2, int y2, int thick, int div, int ox, int oy
    dcx = double(x1 + x2) / 2.0 + ox
    dcy = double(y1 + y2) / 2.0 + oy
    rx = absf(x2 - x1) / 2.0
    ry = absf(y2 - y1) / 2.0
    if rx < 1 || ry < 1 : return
	div_ = div : if div_ <= 0 : div_ = limit((rx+ry)/4, 12, 128)
	if thick == 1 {
		repeat div_
			ang1 = 2.0 * M_PI * cnt / div_
			ang2 = 2.0 * M_PI * (cnt+1) / div_
			x3 = dcx + cos(ang1) * rx
			y3 = dcy + sin(ang1) * ry
			x4 = dcx + cos(ang2) * rx
			y4 = dcy + sin(ang2) * ry
			trianglefao dcx, dcy, x3, y3, x4, y4
		loop
		return
	}
	thick_ = double(thick)
    if thick_ < 1 : thick_ = 1.0
    rx1 = rx - thick_/2.0
    ry1 = ry - thick_/2.0
    rx2 = rx + thick_/2.0
    ry2 = ry + thick_/2.0
    if rx1 < 0 : rx1 = 0
    if ry1 < 0 : ry1 = 0
    repeat div_
        ang1 = 2.0 * M_PI * cnt / div_
        ang2 = 2.0 * M_PI * (cnt+1) / div_
        ox1 = dcx + cos(ang1) * rx2
        oy1 = dcy + sin(ang1) * ry2
        ox2 = dcx + cos(ang2) * rx2
        oy2 = dcy + sin(ang2) * ry2
        ix2 = dcx + cos(ang2) * rx1
        iy2 = dcy + sin(ang2) * ry1
        ix1 = dcx + cos(ang1) * rx1
        iy1 = dcy + sin(ang1) * ry1
        quadfao ox1,oy1, ox2,oy2, ix2,iy2, ix1,iy1
    loop
	return
#deffunc rboxfao int x1, int y1, int x2, int y2, int r, int div, int ox, int oy
	div_ = div : if div_ <= 0 : div_ = limit(6+(r-5)*(12-6)/(25-5), 6,12)
	boxfao x1+r, y1, x2-r, y2, ox,oy
	boxfao x1, y1+r, x1+r, y2-r, ox,oy
	boxfao x2-r, y1+r, x2, y2-r, ox,oy
	repeat 4
		if cnt=0 : cx=x1+r : cy=y1+r : ang0=180.0
		if cnt=1 : cx=x2-r : cy=y1+r : ang0=270.0
		if cnt=2 : cx=x2-r : cy=y2-r : ang0=0.0
		if cnt=3 : cx=x1+r : cy=y2-r : ang0=90.0
		repeat div_
			ang1 = ang0 + 90.0 * cnt/div_
			ang2 = ang0 + 90.0 * (cnt+1)/div_
			x3 = cx + cos(ang1/180.0*M_PI)*r
			y3 = cy + sin(ang1/180.0*M_PI)*r
			x4 = cx + cos(ang2/180.0*M_PI)*r
			y4 = cy + sin(ang2/180.0*M_PI)*r
			trianglefao cx,cy, x3,y3, x4,y4, ox,oy
		loop
	loop
	return
#deffunc rboxfao_auto int x1, int y1, int x2, int y2, int ox, int oy
	w = abs(x2 - x1)
	h = abs(y2 - y1)
	r = (w+h)/40
	if r > w/2 : r = w/2
	if r > h/2 : r = h/2
	if r < 1 : r = 1
	rboxfao x1,y1,x2,y2, r,0, ox,oy
	return
#global